//
//  Tools.cpp
//  StringToNumbers
//
//  Created by 胡鑫 on 2017/4/21.
//  Copyright © 2017年 胡鑫. All rights reserved.
//

#include "Tools.hpp"
#include <utility>
#include <cstdlib>

//const int INT32_STRING = 11; // 10 + 1
//
//list<int32_t> getStrNumbers32(const char *chStr, size_t sz)
//{
//    list<int32_t> lsResult;
//    char chArr[INT32_STRING] = {0,}; //对应int的10个位
//    bool bClear = false;
//    size_t szCount = 0;//用来记录位数
//    
//    for (int i = 0; i < sz; ++i) {
//        if (chStr[i] < '0' || chStr[i] >'9'){ //这里使用ASCLL码判断
//            if(bClear){
//                //进行转换、添加、清除、重置
//                lsResult.push_back(atoi(chArr));//转换、添加
//                memset(chArr, 0, szCount + 1); //清除
//                szCount = 0; //重置
//                bClear = false; //重置
//            }
//            continue;
//        }
//        chArr[szCount++] = chStr[i]; //填入
//        
//        if(!bClear)
//            bClear = true; //开始记录
//    }
//    return move(lsResult);
//}

const int INT32_STRING = 12; // 10位 + 1符号位 + 1结尾符
/*
 * 算法需要空间为12个字符
 * 算法最坏情况为2 * strLen(chStr)
 */
list<int32_t> getStrNumbers32(const char *chStr, size_t sz)
{
    list<int32_t> lsResult;
    char chArr[INT32_STRING] = {0,}; //对应int的10个位 + 符号位
    chArr[0] = '+';//默认是正
    bool bClear = false;
    size_t szCount = 1;//用来记录位数,首字符为符号
    
    for (int i = 0; i < sz; ++i) {
        
        if(chStr[i] == '-' && !bClear){
            bClear = true;
            chArr[0] = '-';
            continue;
        }
        
        if (chStr[i] < '0' || chStr[i] >'9'){ //这里使用ASCLL码判断
            if(bClear){
                //进行转换、添加、清除、重置
                if(szCount != 1) {//被填入过数字
                    lsResult.push_back(atoi(chArr));//转换、添加
                    memset(chArr, 0, szCount + 1); //清除
                }
                szCount = 1; //重置
                bClear = false; //重置
                chArr[0] = '+';//默认是正
            }
            continue;
        }
        chArr[szCount++] = chStr[i]; //填入
        
        if(!bClear)
            bClear = true; //开始记录
    }
    return move(lsResult);
}
